home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 12 - 1996 / 12.12 Dec 96 / Flat File Databases / Invoice Example ƒ / Functional ƒ / NOC.c < prev    next >
Encoding:
Text File  |  1996-03-02  |  4.3 KB  |  126 lines  |  [TEXT/CWIE]

  1. //New Open Close code for Invoicing example
  2. #include "BTreeDef.h"
  3. #include "BTreeProtos.h"
  4. #include "StandardFile.h"
  5. #include "InvoiceGlobals.h"
  6. #include "string.h"
  7. #include "Strings.h"
  8.  
  9. //prototypes
  10. //such a small program, use the globals and not pass parameters
  11. short NewFile(void);
  12. short CloseFile(void);
  13. short OpenFile(void);
  14.  
  15. short NewFile(void) {
  16.     short NewFileErr = noErr;
  17.     Str255    TempString;
  18.     // first ask user to name/create file
  19.     StandardPutFile("\pCreate New Example File", "\puntitled", &gFileReply);
  20.     if (!gFileReply.sfGood){
  21.         //return if user cancels
  22.         NewFileErr = userCanceledErr;
  23.         return NewFileErr;
  24.     }
  25.     //otherwise create the file using the returned StandardFileReply
  26.     //create and fill in the TreeListHandle
  27.     // see B-Tree helper documentation for what is being done here
  28.     gInvoiceTrees = (TreeListHandle)NewHandle(7*sizeof(TreeControlRecord)+2);
  29.     (**gInvoiceTrees).nrTrees = 7;
  30.     (**gInvoiceTrees).trees[kCustomerNumTree].version = 1;
  31.     (**gInvoiceTrees).trees[kCustomerNumTree].maxKeysPerPage = kKeysPerPage;
  32.     (**gInvoiceTrees).trees[kCustomerNumTree].maxKeySize = kCustomerNumSize;
  33.     (**gInvoiceTrees).trees[kCustomerNameTree].version = 1;
  34.     (**gInvoiceTrees).trees[kCustomerNameTree].maxKeysPerPage = kKeysPerPage;
  35.     (**gInvoiceTrees).trees[kCustomerNameTree].maxKeySize = kCustomerNameSize;
  36.     (**gInvoiceTrees).trees[kPartNumTree].version = 1;
  37.     (**gInvoiceTrees).trees[kPartNumTree].maxKeysPerPage = kKeysPerPage;
  38.     (**gInvoiceTrees).trees[kPartNumTree].maxKeySize = kPartNumSize;
  39.     (**gInvoiceTrees).trees[kPartNameTree].version = 1;
  40.     (**gInvoiceTrees).trees[kPartNameTree].maxKeysPerPage = kKeysPerPage;
  41.     (**gInvoiceTrees).trees[kPartNameTree].maxKeySize = kPartNameSize;
  42.     (**gInvoiceTrees).trees[kInvoiceTree].version = 1;
  43.     (**gInvoiceTrees).trees[kInvoiceTree].maxKeysPerPage = kKeysPerPage;
  44.     (**gInvoiceTrees).trees[kInvoiceTree].maxKeySize = kInvoiceNumSize;
  45.     (**gInvoiceTrees).trees[kLineItemTree].version = 1;
  46.     (**gInvoiceTrees).trees[kLineItemTree].maxKeysPerPage = kKeysPerPage;
  47.     (**gInvoiceTrees).trees[kLineItemTree].maxKeySize = kLineItemNumSize;
  48.     (**gInvoiceTrees).trees[kInvoiceCustTree].version = 1;
  49.     (**gInvoiceTrees).trees[kInvoiceCustTree].maxKeysPerPage = kKeysPerPage;
  50.     (**gInvoiceTrees).trees[kInvoiceCustTree].maxKeySize = kCustomerNameSize;
  51.     //set file type
  52.     gFileReply.sfType = kType;
  53.     //call the function
  54.     NewFileErr = FSpCreate_BTreeFile(&gFileReply,&gInvoiceFCH,kCreator,kBlockSize,kSpareBlocks,gInvoiceTrees);
  55.     if (NewFileErr != noErr)
  56.         return NewFileErr;    
  57.     //add resource
  58.     gSequenceHandle = (SRHandle)NewHandle(sizeof(SequenceRecord));
  59.     (**gSequenceHandle).LineItems = 0;
  60.     (**gSequenceHandle).Invoices = 0;
  61.     // create resource fork
  62.     FSpCreateResFile(&gFileReply.sfFile, kCreator, kType, smRoman);
  63.     if (ResError() !=noErr) {
  64.         NewFileErr = ResError();
  65.         return NewFileErr;
  66.         };
  67.     // open resource fork of file
  68.     gResFileNo = FSpOpenResFile(&gFileReply.sfFile, fsCurPerm);
  69.     if (ResError() !=noErr) {
  70.         NewFileErr = ResError();
  71.         return NewFileErr;
  72.         };
  73.     UseResFile(gResFileNo);
  74.     TempString[0]=0;
  75.     AddResource((Handle)gSequenceHandle,kSRType,kSRID,TempString);
  76.     //set file open flag
  77.     gFileIsOpen = TRUE;
  78.     //return to caller
  79. return NewFileErr;
  80. }
  81.  
  82. short OpenFile(void){
  83.     short OpenFileErr = noErr;
  84.     gTypeList[0]= kType;
  85.     StandardGetFile(NULL, 1, gTypeList, &gFileReply);
  86.     if (!gFileReply.sfGood){
  87.         //return if user cancels
  88.         OpenFileErr = userCanceledErr;
  89.         return OpenFileErr;
  90.     }
  91.     //pass the gFileReply to our B-Tree routine
  92.     OpenFileErr = FSpOpen_BTreeFile(&gFileReply,fsCurPerm,&gInvoiceFCH);
  93.     if (OpenFileErr != noErr)
  94.         return OpenFileErr;
  95.     //open the Resource Fork
  96.     gResFileNo = FSpOpenResFile(&gFileReply.sfFile, fsCurPerm);
  97.     if (ResError() != noErr) {
  98.         OpenFileErr = ResError();
  99.         return OpenFileErr;
  100.         };
  101.     (Handle)gSequenceHandle = GetResource(kSRType,kSRID);
  102.     if (ResError() !=noErr) {
  103.         OpenFileErr = ResError();
  104.         return OpenFileErr;
  105.         };
  106.     gFileIsOpen = TRUE;
  107.     }//that's all there is to it.
  108.     
  109.     
  110. short CloseFile(void) {
  111.     short CloseFileErr = noErr;
  112.     //flush volume
  113.     WriteResource((Handle)gSequenceHandle);
  114.     CloseFileErr = FlushVol(gFileReply.sfFile.name, gFileReply.sfFile.vRefNum);
  115.     //close res file
  116.     CloseResFile(gResFileNo);
  117.     //close data file
  118.     CloseFileErr = Close_BTreeFile(&gInvoiceFCH);
  119.     //set structures to nil or zero, as case may be
  120.     if (gInvoiceFCH)
  121.         gInvoiceFCH = NULL;
  122.     if (gInvoiceTrees)
  123.         gInvoiceTrees = NULL;
  124.     gFileIsOpen = FALSE;
  125.     }
  126.